#ifndef xpack_configure_init_order
#define xpack_configure_init_order
#include"macro/xexport.hpp"

// 约定：
// 为了避免 fork 的子进程功能不完全，需要在 fork 后再调用一遍 init_list_execute() 然后再执行其他操作
// 为了避免递归 fork，下列模块如果使用了 fork() 函数，则不能再被调用
// 由于 fork 出来的子进程不会复制父进程的子线程，所以对于 the_gc_background 模块可能会出现死锁的情况
namespace mixc::configure_init_order::origin{
    // 可以并行执行的赋予相同的枚举值
    // 排在前面的先执行，后执行的必须等待所有先执行的完成之后才能执行
    enum init_order_t{
        // 主线程 mutex 初始化
        the_concurrency_thread_self,

        the_concurrency_process = the_concurrency_thread_self,

        // 控制台初始化模块
        the_io_private_tty,

        // 线程退出时，若还有未释放的内存，则会将当前线程的内存所有权交给专门的后台线程管理
        // 内存回收单元
        the_mem,

        // at 命令初始化
        the_at_cmd = the_mem,

        // GC 可回收对象筛选单元
        // GC 内存释放单元
        the_gc_background,

        // 单元测试模块
        the_test,

        // 主函数
        the_main,

        // rtos 调度
        // 注意：
        // 不要在此任务后在放置追加其他任务
        // 开启调度后，cpu 就会切换出去，不会再继续执行了
        // ==============================================
        the_rtos_prepare,
        the_rtos_schedule,
        
        // 必须放在最后，表示初始化优先级个数
        max_init_order,
    };
}

#endif

xexport_space(mixc::configure_init_order::origin)
